package io.gitee.buzizhi.tools;

import java.io.*;
import java.nio.charset.Charset;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.nio.file.StandardCopyOption;

/**
 * @author :JSF
 * @date :2020/6/5 12:50
 * @desc :文件工具类
 */
public class FileTool {


    /**
     * <li> 获取文件内容以字符串返回 编码格式为GBK</li>
     * @param path
     * @return
     * @throws IOException
     */
    public static String getFileContextGBK(String path) throws IOException {
        return getFileContext(path,Charset.forName("gbk"));
    }

    /**
     * <li> 获取文件内容以字符串返回 编码格式为UTF-8</li>
     * @param path
     * @return
     * @throws IOException
     */
    public static String getFileContextUTF8(String path) throws IOException {
        return getFileContext(path,Charset.forName("utf-8"));
    }

    /**
     * <li> 获取文件内容以字符串返回 自定义编码格式</li>
     * @param path 路径
     * @param charset 编码格式
     * @return
     * @throws IOException
     */
    public static String getFileContext(String path,Charset charset) throws IOException {
        File file = new File(path);
        if(file.isDirectory())
            throw new IllegalArgumentException("\"" + path + "\" is directory,can only be files.");
        if(!file.exists())
            throw new FileNotFoundException(path + " file is not exists.");
        BufferedReader br=new BufferedReader(new InputStreamReader(new FileInputStream(file), charset));
        String line = null;
        StringBuffer result = new StringBuffer();
        while ((line = br.readLine()) != null) {
            result.append(line).append("\n");
        }
        return result.toString();
    }


    /**
     * <li> 删除文件夹中的所有文件包含文件夹</li>
     * @param path 路径
     */
    public static void deleteFile(String path) throws FileNotFoundException {
        File file = new File(path);
        if(!file.exists())
            throw new FileNotFoundException("file not exists...");
        if(file.isDirectory()){
            String[] list = file.list();
            if(list != null && list.length >0){
                for(String f:list){
                    deleteFile(path+"/"+f);
                }
            }
            file.delete();
        }else
            file.delete();
    }

    /**
     * <li> 文件复制</li>
     * @param sourceFilePath 源文件路径
     * @param targetDir 目标文件夹
     * @return boolean
     */
    public static boolean copy(String sourceFilePath,String targetDir){
        //获取源文件的名称
        //目标文件地址
        String newFileName = sourceFilePath.substring(sourceFilePath.lastIndexOf("\\")+1);
        //源文件地址
        String targetFile = targetDir + File.separator + newFileName;
        try {
            //创建输入流对象
            FileInputStream fis = new FileInputStream(sourceFilePath);
            //创建输出流对象
            FileOutputStream fos = new FileOutputStream(targetFile);
            //创建搬运工具
            byte datas[] = new byte[1024*8];
            //创建长度
            int len = 0;
            //循环读取数据
            while((len = fis.read(datas))!=-1)
            {
                fos.write(datas,0,len);
            }
            fis.close();//释放资源
            fis.close();//释放资源
            return true;
        }
        catch (Exception e) {
            e.printStackTrace();
        }
        return false;
    }

    /**
     * <li> 文件移动（使用源文件名称）</li>
     * @param sourceFilePath 源文件路径
     * @param targetDir 目标文件夹路径
     * @return boolean
     */
    public static boolean moveToDir(String sourceFilePath,String targetDir){
        //源文件
        File file=new File(sourceFilePath);
        String originFileName = file.getName();
        return moveToFile(sourceFilePath,targetDir,originFileName);
    }

    /**
     * <li> 文件移动(可以自定义文件名称)</li>
     * @param sourceFilePath 源文件路径
     * @param targetFilePath 目标文件路径
     * @return
     */
    public static boolean moveToFile(String sourceFilePath,String targetFilePath){
        //源文件
        File file=new File(sourceFilePath);
        return file.renameTo(new File(targetFilePath));
    }

    /**
     * <li> 移动文件到指定文件夹，并自定义名称</li>
     * @param sourceFilePath 源文件路径
     * @param targetDir 目标文件夹
     * @param targetFileName 目标文件名称
     * @return
     */
    public static boolean moveToFile(String sourceFilePath,String targetDir,String targetFileName){
        //源文件
        File file=new File(sourceFilePath);
        String finalTargetFileName;
        if(targetDir.endsWith("\\") || targetDir.endsWith("/")){
            finalTargetFileName = targetDir + targetFileName;
        }else{
            finalTargetFileName = targetDir + File.separator + targetFileName;
        }
        return file.renameTo(new File(finalTargetFileName));
    }

}
